home *** CD-ROM | disk | FTP | other *** search
/ Game.EXE 2001 January / Game.EXE_01_2001.iso / demos / Blade of Darkness / data1.cab / Program_Executable_Files / Lib / Auras.py < prev    next >
Encoding:
Python Source  |  2000-11-16  |  9.6 KB  |  270 lines

  1.  
  2. # EXAMPLE OF USE
  3. # make an ice aura (just using gradient 2) to last 5 minutes....
  4. #aura= Auras.MakeAura ("Player1",5.0*60.0,(25,1.0,1.0,1,0,0), (),(),(2,  0.8,0.8,1.0, 1.0, 0.6  , 0.0,0.0,1.0, 0.0, 1.0))
  5. # interpolate to a fire aura over 1 second
  6. #aura.Data.AddEvent(Bladex.GetTime()+1.0, (25,1.0,1.0,1,0,0), (),(),(2,  1.0,0.7,0.0, 1.0, 0.5  , 1.0,0.0,0.0, 0.0, 1.0))
  7. # interpolate back to ice aura over 0.1 seconds
  8. #aura.Data.AddEvent(Bladex.GetTime()+0.1, (25,1.0,1.0,1,0,0), (),(),(2,  0.8,0.8,1.0, 1.0, 0.6  , 0.0,0.0,1.0, 0.0, 1.0))
  9.  
  10. # See the special damage functions in the file Damage.py for more examples...
  11.  
  12.  
  13. import Bladex
  14. import ObjStore
  15.  
  16. Bladex.CreateTimer('Timer20',1.0/20.0)
  17.  
  18. class AnimateableAura:
  19.     def __init__(self, aura, time2live, AuraParams, AuraGradient0=(),AuraGradient1=(),AuraGradient2=(),Active=1,XtraParam=()):
  20.         self.ObjId=ObjStore.GetNewId()
  21.         ObjStore.ObjectsStore[self.ObjId]=self
  22.  
  23.         self.EventList=[]
  24.         self.Name= aura.Name
  25.         self.TimerName= 'Timer20'
  26.         self.TimerFrequency= 1.0/20.0
  27.  
  28.         # set initial params
  29.         self.AuraParams= AuraParams
  30.         apply(aura.SetAuraParams, self.AuraParams)
  31.  
  32.         # set initial gradient 0
  33.         if AuraGradient0: self.AuraGradient0= AuraGradient0            
  34.         else: self.AuraGradient0= (0,  0.0,0.0,0.0, 0.0, 0.0  , 0.0,0.0,0.0, 0.0, 0.0)            
  35.         apply(aura.SetAuraGradient, self.AuraGradient0)        
  36.  
  37.         # set initial gradient 1
  38.         if AuraGradient1: self.AuraGradient1= AuraGradient1            
  39.         else: self.AuraGradient1= (1,  0.0,0.0,0.0, 0.0, 0.0  , 0.0,0.0,0.0, 0.0, 0.0)            
  40.         apply(aura.SetAuraGradient, self.AuraGradient1)
  41.  
  42.         # set initial gradient 2
  43.         if AuraGradient2: self.AuraGradient2= AuraGradient2
  44.         else: self.AuraGradient2= (2,  0.0,0.0,0.0, 0.0, 0.0  , 0.0,0.0,0.0, 0.0, 0.0)
  45.         apply(aura.SetAuraGradient, self.AuraGradient2)
  46.  
  47.         # set deathtime, & subscribe to timer...
  48.         if time2live>0.0: self.DeathTime= Bladex.GetTime()+time2live
  49.         else: self.DeathTime= -1.0
  50.         aura.TimerFunc= self.TimerFunc
  51.         aura.SubscribeToList(self.TimerName)
  52.  
  53.         # set active by default
  54.         self.Active= Active
  55.         aura.SetAuraActive(self.Active)
  56.  
  57.         # Establece el valor inicial del parametro extra
  58.         self.OldXtraParam=self.XtraParam=XtraParam
  59.         if XtraParam:
  60.             exec_string = XtraParam[0] + '=' + str(XtraParam[1])
  61.             exec(exec_string)
  62.  
  63.     def __del__(self):
  64.         del ObjStore.ObjectsStore[self.ObjId]    
  65.  
  66.     def persistent_id(self):
  67.         return self.ObjId
  68.  
  69.  
  70.     def __getstate__(self):
  71.         # Tiene que devolver como poder guardar el estado de la clase
  72.  
  73.         return (1,
  74.                 self.ObjId,
  75.                 self.EventList,
  76.                 self.Name,
  77.                 self.TimerName,
  78.                 self.TimerFrequency,
  79.                 self.AuraParams,
  80.                 self.AuraGradient0,
  81.                 self.AuraGradient1,
  82.                 self.AuraGradient2,
  83.                 self.DeathTime,
  84.                 self.Active,
  85.                 self.OldXtraParam,
  86.                 self.XtraParam
  87.                 )
  88.  
  89.     def __setstate__(self,parm):
  90.         # Toma como parΓ«Ñtro lo que devuelve __getstate__() y debe recrear la clase
  91.  
  92.         if parm[0]==1:
  93.             #self.ObjId=parm[1] En GameStateAux.PersistentObject()
  94.             self.ObjId=parm[1]
  95.             ObjStore.ObjectsStore[self.ObjId]=self
  96.             self.EventList=parm[2]
  97.             self.Name=parm[3]
  98.             self.TimerName=parm[4]
  99.             self.TimerFrequency=parm[5]
  100.             self.AuraParams=parm[6]
  101.             self.AuraGradient0=parm[7]
  102.             self.AuraGradient1=parm[8]
  103.             self.AuraGradient2=parm[9]
  104.             self.DeathTime=parm[10]
  105.             self.Active=parm[11]
  106.             self.OldXtraParam=parm[12]
  107.             self.XtraParam=parm[13]
  108.         else:
  109.             print "AnimateableAura.__setstate__() -> Version mismatch"
  110.             self.ObjId=ObjStore.GetNewId()
  111.             ObjStore.ObjectsStore[self.ObjId]=self
  112.             self.EventList=[]
  113.             self.Name= "Error loading"
  114.             self.TimerName= 'Timer20'
  115.             self.TimerFrequency= 1.0/20.0
  116.  
  117.  
  118.     # comparison function for time-based sort
  119.     def FirstTime(self, e1, e2):        
  120.         if e1[0]<e2[0]: return -1 #CHOOSE_FIRST            
  121.         elif e2[0]>e1[0]: return 1  #CHOOSE_SECOND            
  122.         else: return 0  #CHOOSE_EITHER                
  123.  
  124.     def AddEvent (self, time, AuraParams, AuraGradient0=(),AuraGradient1=(),AuraGradient2=(),Active=1,XtraParam=()):
  125.         self.EventList.append([time, AuraParams, AuraGradient0, AuraGradient1, AuraGradient2,Active,XtraParam])
  126.         # Sort the events into first event first order...
  127.         self.EventList.sort(self.FirstTime)
  128.         
  129.     def TimerFunc(self, obj_name, time):        
  130.         if self.DeathTime>=0.0 and time>self.DeathTime:
  131.             self.EventList=[]
  132.             self.Active=0
  133.             if self.OldXtraParam:
  134.                 exec_string = self.OldXtraParam[0] + '=' + str(self.OldXtraParam[1])
  135.                 exec(exec_string)
  136.             aura= Bladex.GetEntity(self.Name)
  137.             aura.SetAuraActive(0)            
  138.             aura.RemoveFromList(self.TimerName)
  139.             aura.SubscribeToList('Pin') # this should remove this class instance too            
  140.             return
  141.         elif len(self.EventList)<1:
  142.             # No events to process, return
  143.             return
  144.         else:
  145.             # Process using the first event
  146.             NextTime, AuraParams, AuraGradient0, AuraGradient1, AuraGradient2, Active, XtraParam= self.EventList[0]
  147.             if time>=NextTime:
  148.                 # We have reached an event                
  149.                 aura= Bladex.GetEntity(self.Name)
  150.                 
  151.                 # set params
  152.                 self.AuraParams= AuraParams
  153.                 apply(aura.SetAuraParams, self.AuraParams)
  154.                 
  155.                 # set gradient0
  156.                 if AuraGradient0:
  157.                     self.AuraGradient0= AuraGradient0
  158.                     apply(aura.SetAuraGradient, self.AuraGradient0)
  159.                 
  160.                 # set gradient1
  161.                 if AuraGradient1:
  162.                     self.AuraGradient1= AuraGradient1
  163.                     apply(aura.SetAuraGradient, self.AuraGradient1)
  164.                 
  165.                 # set gradient2
  166.                 if AuraGradient2:
  167.                     self.AuraGradient2= AuraGradient2
  168.                     apply(aura.SetAuraGradient, self.AuraGradient2)
  169.                                 
  170.                 if Active!=self.Active:
  171.                     self.active= Active
  172.                     aura.SetAuraActive(self.Active)
  173.  
  174.                 if XtraParam:
  175.                     self.XtraParam=XtraParam
  176.                     exec_string = XtraParam[0] + '=' + str(XtraParam[1])
  177.                     exec(exec_string)
  178.  
  179.                 # Comprueba si va a haber cambios en el intervalo actual, para no estar llamando al timer innecesariamente
  180.  
  181.                 nNextTime, nAuraParams, nAuraGradient0, nAuraGradient1, nAuraGradient2, nActive, nXtraParam= self.EventList[1]
  182.  
  183.                 if not ((AuraParams<>nAuraParams) or (AuraGradient2<>nAuraGradient2) or (XtraParam<>nXtraParam) or (AuraGradient0<>nAuraGradient0) or (AuraGradient1<>nAuraGradient1)):
  184.                     aura.RemoveFromList(self.TimerName)
  185.                     Bladex.AddScheduledFunc(nNextTime, aura.SubscribeToList, (self.TimerName,))
  186.  
  187.                 # remove the event, it is dealt with
  188.                 del self.EventList[0]
  189.             else:
  190.                 # interpolate towards the next event                                
  191.  
  192.                 a= self.TimerFrequency/(self.TimerFrequency+NextTime-time)
  193.                 aura= Bladex.GetEntity(self.Name)
  194.  
  195.                 # interpolate params
  196.                 fSize, fAlpha,fIntensity, iFrontFaceCulling, iBackFaceCulling, iAdditive= self.AuraParams
  197.                 fSize= fSize+(AuraParams[0]-fSize)*a
  198.                 fAlpha= fAlpha+(AuraParams[1]-fAlpha)*a
  199.                 fIntensity= fIntensity+(AuraParams[2]-fIntensity)*a
  200.                 self.AuraParams= fSize, fAlpha,fIntensity, iFrontFaceCulling, iBackFaceCulling, iAdditive
  201.                 apply(aura.SetAuraParams, self.AuraParams)
  202.                 
  203.                 # interpolate gradient0
  204.                 if AuraGradient0:
  205.                     iStage, fR0, fG0, fB0, fA0, fStart, fR1, fG1, fB1, fA1, fEnd= self.AuraGradient0
  206.                     fR0= fR0+(AuraGradient0[1]-fR0)*a
  207.                     fG0= fG0+(AuraGradient0[2]-fG0)*a
  208.                     fB0= fB0+(AuraGradient0[3]-fB0)*a
  209.                     fA0= fA0+(AuraGradient0[4]-fA0)*a
  210.                     fStart= fStart+(AuraGradient0[5]-fStart)*a
  211.                     fR1= fR1+(AuraGradient0[6]-fR1)*a
  212.                     fG1= fG1+(AuraGradient0[7]-fG1)*a
  213.                     fB1= fB1+(AuraGradient0[8]-fB1)*a
  214.                     fA1= fA1+(AuraGradient0[9]-fA1)*a
  215.                     fEnd= fEnd+(AuraGradient0[10]-fEnd)*a
  216.                     self.AuraGradient0= iStage, fR0, fG0, fB0, fA0, fStart, fR1, fG1, fB1, fA1, fEnd
  217.                     apply(aura.SetAuraGradient, self.AuraGradient0)
  218.                 
  219.                 # interpolate gradient1
  220.                 if AuraGradient1:
  221.                     iStage, fR0, fG0, fB0, fA0, fStart, fR1, fG1, fB1, fA1, fEnd= self.AuraGradient1
  222.                     fR0= fR0+(AuraGradient1[1]-fR0)*a
  223.                     fG0= fG0+(AuraGradient1[2]-fG0)*a
  224.                     fB0= fB0+(AuraGradient1[3]-fB0)*a
  225.                     fA0= fA0+(AuraGradient1[4]-fA0)*a
  226.                     fStart= fStart+(AuraGradient1[5]-fStart)*a
  227.                     fR1= fR1+(AuraGradient1[6]-fR1)*a
  228.                     fG1= fG1+(AuraGradient1[7]-fG1)*a
  229.                     fB1= fB1+(AuraGradient1[8]-fB1)*a
  230.                     fA1= fA1+(AuraGradient1[9]-fA1)*a
  231.                     fEnd= fEnd+(AuraGradient1[10]-fEnd)*a
  232.                     self.AuraGradient1= iStage, fR0, fG0, fB0, fA0, fStart, fR1, fG1, fB1, fA1, fEnd
  233.                     apply(aura.SetAuraGradient, self.AuraGradient1)
  234.                 
  235.                 # interpolate gradient2
  236.                 if AuraGradient2:
  237.                     iStage, fR0, fG0, fB0, fA0, fStart, fR1, fG1, fB1, fA1, fEnd= self.AuraGradient2
  238.                     fR0= fR0+(AuraGradient2[1]-fR0)*a
  239.                     fG0= fG0+(AuraGradient2[2]-fG0)*a
  240.                     fB0= fB0+(AuraGradient2[3]-fB0)*a
  241.                     fA0= fA0+(AuraGradient2[4]-fA0)*a
  242.                     fStart= fStart+(AuraGradient2[5]-fStart)*a
  243.                     fR1= fR1+(AuraGradient2[6]-fR1)*a
  244.                     fG1= fG1+(AuraGradient2[7]-fG1)*a
  245.                     fB1= fB1+(AuraGradient2[8]-fB1)*a
  246.                     fA1= fA1+(AuraGradient2[9]-fA1)*a
  247.                     fEnd= fEnd+(AuraGradient2[10]-fEnd)*a
  248.                     self.AuraGradient2= iStage, fR0, fG0, fB0, fA0, fStart, fR1, fG1, fB1, fA1, fEnd
  249.                     apply(aura.SetAuraGradient, self.AuraGradient2)
  250.  
  251.                 if XtraParam:
  252.                     Param, Value=self.XtraParam
  253.                     exec_string = Param + '=' + Param + '+(' + str(XtraParam[1]) + '-' + Param + ')*' + str(a)
  254.                     exec(exec_string)
  255.                     exec_string2 = 'Value=' + Param
  256.                     exec(exec_string2)
  257.                     self.XtraParam=Param, Value
  258.  
  259.  
  260.  
  261. def MakeAura (EntityName,time2live,StartAuraParams,StartAuraGradient0=(),StartAuraGradient1=(),StartAuraGradient2=(),StartActive=1,XtraParam=()):
  262.     # EntityName is the entity to link to
  263.     # give time2live as -1 to last forever
  264.     me= Bladex.GetEntity(EntityName)
  265.     pos= me.Position    
  266.     aura= Bladex.CreateEntity(EntityName+"_Aura","Entity Aura",pos[0],pos[1],pos[2])    
  267.     me.Link(aura)
  268.     aura.Data= AnimateableAura(aura,time2live,StartAuraParams, StartAuraGradient0,StartAuraGradient1,StartAuraGradient2,StartActive,XtraParam)
  269.     return aura
  270.